package co.com.ticci.mb.general;

import java.util.ArrayList;
import java.util.List;

import co.com.autolavado.ln.AccionesLn;

public class Crud 
{
	private ArrayList<Object> 					   listaView;
	private ArrayList<Object> 					   listaInicial;
	
	
	private ArrayList<Object> 					   listaInsertados;
	private ArrayList<Object> 					   listaActualizados;
	private ArrayList<Object> 					   listaBorrados;
	private ArrayList<ArrayList<? extends Object>> listaCambios;
	private AccionesLn 							   accionesLn; 
	
	
	public Crud() 
	{
		listaInsertados   = new ArrayList<Object>();
		listaActualizados = new ArrayList<Object>();
		listaBorrados     = new ArrayList<Object>();
		accionesLn        = new AccionesLn();
	}
	
	public void iniciarCrud(List< ? extends Object> listaInicial)
	{
		listaInicial = listaInicial == null ? new ArrayList<Object>() : listaInicial;
		
		this.listaInicial = new ArrayList<Object>(listaInicial);
		this.listaView    = new ArrayList<Object>(listaInicial);	
	}
	
	private ArrayList<? extends Object> validarInsersiones()
	{
		ArrayList<Object> registrosConfirmados =  new ArrayList<Object>();
		
		for (int i = 0; i < listaView.size(); i++) 
		{
			Object registro = listaView.get(i);
			
			if(listaInicial.indexOf(registro) == -1)
			{
				registrosConfirmados.add(registro);
			}
			
		}
		return registrosConfirmados;
	}
	
	private ArrayList<? extends Object> validarActualizaciones()
	{
		ArrayList<Object> registrosConfirmados =  new ArrayList<Object>();
		
		for (int i = 0; i < listaActualizados.size(); i++) 
		{
			Object registro = listaActualizados.get(i);
			
			if(listaBorrados.indexOf(registro) == -1)
			{
				if(listaInsertados.indexOf(registro) == -1)
				{	
					boolean registroRepetido = false;
					
					for (int j = 0; j < registrosConfirmados.size(); j++) 
					{
						Object registroAuxiliar = registrosConfirmados.get(j);
						
						try
						{
							if(registro.equals(registroAuxiliar))
							{
								registroRepetido = true;
								break;
							}
						}
						catch(Exception e)
						{
							
						}
					}
					if(!registroRepetido)
					{
						registrosConfirmados.add(registro);
					}
				}
			}
			
		}
		 return registrosConfirmados;
	}
	
	private ArrayList<? extends Object> validarEliminaciones()
	{
		ArrayList<Object> registrosConfirmados =  new ArrayList<Object>();
		
		for (int i = 0; i < listaBorrados.size(); i++) 
		{
			Object registro = listaBorrados.get(i);
			
			if(listaInicial.indexOf(registro) != -1)
			{
				if(listaBorrados.indexOf(registro)!=-1)
				{
					registrosConfirmados.add(registro);
				}
			}
		}
		return registrosConfirmados;
	}
	
	public ArrayList<ArrayList<? extends Object>> getResultadosCrud()
	{
		listaCambios = new ArrayList<ArrayList<? extends Object>>();
		
		listaCambios.add(validarActualizaciones());
		listaCambios.add(validarInsersiones());
		listaCambios.add(validarEliminaciones());
		
		return listaCambios;
	}
	
	public String guardarCambios()
	{
		return accionesLn.gestionarInformacion(listaCambios.get(1),listaCambios.get(2),listaCambios.get(0));
	}
	
	public boolean existenCambios()
	{
		boolean existenCambios = false;
		
		if(this != null)
		{
			ArrayList<ArrayList<? extends Object>> listaCambios = this.getResultadosCrud();
			
			ArrayList<Object> actualizaciones 			= (ArrayList<Object>) listaCambios.get(0);
			ArrayList<Object> insertados      			= (ArrayList<Object>) listaCambios.get(1);
			ArrayList<Object> eliminaciones   			= (ArrayList<Object>) listaCambios.get(2);
			
			if(actualizaciones.size() != 0 ||  insertados.size() != 0 ||  eliminaciones.size() != 0)
			{
				existenCambios = true;
			}
		}
		
		return existenCambios;
	}
	
	public void agregarElemento(Object nuevoElemento)
	{
		listaInsertados . add(nuevoElemento);
		listaView       . add(0, nuevoElemento);
	}
	
	public void actualizarElemento(Object nuevoElemento)
	{
		listaActualizados . add(nuevoElemento);
		
	}
	
	public void eliminarElemento(Object nuevoElemento)
	{
		if(nuevoElemento != null)
		{
			listaBorrados. add(nuevoElemento);
			listaView    . remove(nuevoElemento);
		}
	}
	
	// METODOS GETTER Y SETTER
	
	public ArrayList<? extends Object> getListaView()
	{
		return listaView;
	}

	
	public void setListaView(ArrayList<? extends Object> listaView) 
	{
		this.listaView = (ArrayList<Object>) listaView;
	}

	public ArrayList<Object> getListaInicial() 
	{
		return listaInicial;
	}

	public void setListaInicial(ArrayList<? extends Object> listaInicial)
	{
		this.listaInicial = (ArrayList<Object>) listaInicial;
	}

	public ArrayList<Object> getListaInsertados() 
	{
		return listaInsertados;
	}

	public void setListaInsertados(ArrayList<Object> listaInsertados) 
	{
		this.listaInsertados = listaInsertados;
	}

	public ArrayList<Object> getListaActualizados() 
	{
		return listaActualizados;
	}

	public void setListaActualizados(ArrayList<Object> listaActualizados)
	{
		this.listaActualizados = listaActualizados;
	}

	public ArrayList<Object> getListaBorrados()
	{
		return listaBorrados;
	}

	public void setListaBorrados(ArrayList<Object> listaBorrados) 
	{
		this.listaBorrados = listaBorrados;
	}
	
}

